package com.demo.synchronized_.deadLock_;

import java.lang.reflect.Field;

/**
 * @author gy
 * @date 2022/4/23
 */
public class DeadLock {
    public static void main(String[] args) throws NoSuchFieldException {
        DeadLockDemo t1 = new DeadLockDemo(true);
        DeadLockDemo t2 = new DeadLockDemo(false);
        t1.setName("线程A");
        t2.setName("线程B");
        t1.start();
        t2.start();
    }

}
class DeadLockDemo extends Thread{

    static Object o1 = new Object();
    static Object o2 = new Object();
    private boolean flag;

    public DeadLockDemo(boolean flag) {
        this.flag = flag;
    }


    @Override
    public void run() {
        /**
         * 1、如果 flag 为 true，线程A 就会得到 持有 o1 对象锁，然后尝试获取 o2 对象锁
         * 2、如果 线程A 得不到 o2 对象锁，就会进入 阻塞状态 Blocked
         * 同理可得
         * 3、如果 flag 为 false，线程B 就会得到 持有 o2 对象锁，然后尝试获取 o1 对象锁
         * 4、如果 线程B 得不到 o1 对象锁，就会进入 阻塞状态 Blocked
         */
        if (flag) {
            synchronized (o1){
                System.out.println(Thread.currentThread().getName() + "进入1");
                synchronized (o2){
                    System.out.println(Thread.currentThread().getName() + "进入2");
                }
            }
        }else {
            synchronized (o2){
                System.out.println(Thread.currentThread().getName() + "进入3");
                synchronized (o1){
                    System.out.println(Thread.currentThread().getName() + "进入4");
                }
            }
        }
    }
}
